// 导入必要的模块
const jwt = require('jsonwebtoken');
const dotenv = require('dotenv');

// 确保中间件目录存在
const fs = require('fs');
const path = require('path');
const middlewareDir = path.dirname(__filename);

if (!fs.existsSync(middlewareDir)) {
  fs.mkdirSync(middlewareDir, { recursive: true });
}

dotenv.config();
const JWT_SECRET = process.env.JWT_SECRET || 'default_secret_key';

/**
 * 身份验证中间件
 * 验证JWT令牌并将用户信息添加到请求对象中
 */
const authMiddleware = (req, res, next) => {
  // 从请求头中获取授权令牌
  const authHeader = req.headers.authorization;
  
  if (!authHeader) {
    return res.status(401).json({
      message: '未提供授权令牌'
    });
  }
  
  // 提取令牌（格式：Bearer token）
  const token = authHeader.split(' ')[1];
  
  if (!token) {
    return res.status(401).json({
      message: '无效的授权令牌格式'
    });
  }
  
  try {
    // 验证令牌
    const decoded = jwt.verify(token, JWT_SECRET);
    
    // 将用户信息添加到请求对象中
    req.user = {
      id: decoded.id,
      username: decoded.username,
      role: decoded.role
    };
    
    next(); // 继续处理请求
  } catch (error) {
    // 令牌验证失败
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({
        message: '令牌已过期'
      });
    } else {
      return res.status(401).json({
        message: '无效的授权令牌'
      });
    }
  }
};

/**
 * 管理员权限验证中间件
 * 确保用户具有管理员角色
 */
const adminMiddleware = (req, res, next) => {
  // 首先需要通过身份验证
  authMiddleware(req, res, () => {
    // 检查用户角色是否为管理员
    if (req.user && req.user.role === 'admin') {
      next(); // 用户是管理员，继续处理请求
    } else {
      return res.status(403).json({
        message: '需要管理员权限'
      });
    }
  });
};

/**
 * 可选的身份验证中间件
 * 如果提供了有效的令牌，则进行验证并添加用户信息；否则继续处理请求
 */
const optionalAuthMiddleware = (req, res, next) => {
  const authHeader = req.headers.authorization;
  
  if (!authHeader) {
    // 没有提供令牌，继续处理请求
    return next();
  }
  
  const token = authHeader.split(' ')[1];
  
  if (!token) {
    // 令牌格式无效，继续处理请求
    return next();
  }
  
  try {
    // 验证令牌
    const decoded = jwt.verify(token, JWT_SECRET);
    
    // 将用户信息添加到请求对象中
    req.user = {
      id: decoded.id,
      username: decoded.username,
      role: decoded.role
    };
  } catch (error) {
    // 令牌验证失败，不影响请求继续处理
    console.warn('可选身份验证失败:', error.message);
  }
  
  next(); // 继续处理请求
};

// 导出中间件函数
module.exports = {
  authMiddleware,
  adminMiddleware,
  optionalAuthMiddleware
};